#!BPY

"""
Name: 'Chi-function set'
Blender: 244
Group: 'Mesh'
Tooltip: 'Draw set of points given by characteristic function'
"""

import Blender
from Blender import NMesh
import bpy

loc={"true":True,"false":False} # creating of locals for 
import math                                       # eval in f. See below.
for k,v in math.__dict__.iteritems():
	loc[k]=v
import bodies
for k,v in bodies.__dict__.iteritems():
	loc[k]=v

print "You can use this set of inentifiers: x,y,z,"+",".join(loc.keys())

def f(x,y,z): # characteristic function
	loc["x"]=x
	loc["y"]=y
	loc["z"]=z
	v=eval(functiontext,loc,{})
	if type(v)!=type(True):
		raise NameError("not boolean function value")
	return v

vertex_by_edge=[
[0.5,0,0], [1,0.5,0], [0.5,1,0], [0,0.5,0],
[0.5,0,1], [1,0.5,1], [0.5,1,1], [0,0.5,1],
[0,0,0.5], [1,0,0.5], [1,1,0.5], [0,1,0.5]]

faces_by_case=[[], 
[[0, 8, 3]],
[[0, 1, 9]],
[[1, 8, 3], [9, 8, 1]],
[[1, 2, 10]],
[[0, 8, 3], [1, 2, 10]],
[[9, 2, 10], [0, 2, 9]],
[[2, 8, 3], [2, 10, 8], [10, 9, 8]],
[[3, 11, 2]],
[[0, 11, 2], [8, 11, 0]],
[[1, 9, 0], [2, 3, 11]],
[[1, 11, 2], [1, 9, 11], [9, 8, 11]],
[[3, 10, 1], [11, 10, 3]],
[[0, 10, 1], [0, 8, 10], [8, 11, 10]],
[[3, 9, 0], [3, 11, 9], [11, 10, 9]],
[[9, 8, 10], [10, 8, 11]],
[[4, 7, 8]],
[[4, 3, 0], [7, 3, 4]],
[[0, 1, 9], [8, 4, 7]],
[[4, 1, 9], [4, 7, 1], [7, 3, 1]],
[[1, 2, 10], [8, 4, 7]],
[[3, 4, 7], [3, 0, 4], [1, 2, 10]],
[[9, 2, 10], [9, 0, 2], [8, 4, 7]],
[[2, 10, 9], [2, 9, 7], [2, 7, 3], [7, 9, 4]],
[[8, 4, 7], [3, 11, 2]],
[[11, 4, 7], [11, 2, 4], [2, 0, 4]],
[[9, 0, 1], [8, 4, 7], [2, 3, 11]],
[[4, 7, 11], [9, 4, 11], [9, 11, 2], [9, 2, 1]],
[[3, 10, 1], [3, 11, 10], [7, 8, 4]],
[[1, 11, 10], [1, 4, 11], [1, 0, 4], [7, 11, 4]],
[[4, 7, 8], [9, 0, 11], [9, 11, 10], [11, 0, 3]],
[[4, 7, 11], [4, 11, 9], [9, 11, 10]],
[[9, 5, 4]],
[[9, 5, 4], [0, 8, 3]],
[[0, 5, 4], [1, 5, 0]],
[[8, 5, 4], [8, 3, 5], [3, 1, 5]],
[[1, 2, 10], [9, 5, 4]],
[[3, 0, 8], [1, 2, 10], [4, 9, 5]],
[[5, 2, 10], [5, 4, 2], [4, 0, 2]],
[[2, 10, 5], [3, 2, 5], [3, 5, 4], [3, 4, 8]],
[[9, 5, 4], [2, 3, 11]],
[[0, 11, 2], [0, 8, 11], [4, 9, 5]],
[[0, 5, 4], [0, 1, 5], [2, 3, 11]],
[[2, 1, 5], [2, 5, 8], [2, 8, 11], [4, 8, 5]],
[[10, 3, 11], [10, 1, 3], [9, 5, 4]],
[[4, 9, 5], [0, 8, 1], [8, 10, 1], [8, 11, 10]],
[[5, 4, 0], [5, 0, 11], [5, 11, 10], [11, 0, 3]],
[[5, 4, 8], [5, 8, 10], [10, 8, 11]],
[[9, 7, 8], [5, 7, 9]],
[[9, 3, 0], [9, 5, 3], [5, 7, 3]],
[[0, 7, 8], [0, 1, 7], [1, 5, 7]],
[[1, 5, 3], [3, 5, 7]],
[[9, 7, 8], [9, 5, 7], [10, 1, 2]],
[[10, 1, 2], [9, 5, 0], [5, 3, 0], [5, 7, 3]],
[[8, 0, 2], [8, 2, 5], [8, 5, 7], [10, 5, 2]],
[[2, 10, 5], [2, 5, 3], [3, 5, 7]],
[[7, 9, 5], [7, 8, 9], [3, 11, 2]],
[[9, 5, 7], [9, 7, 2], [9, 2, 0], [2, 7, 11]],
[[2, 3, 11], [0, 1, 8], [1, 7, 8], [1, 5, 7]],
[[11, 2, 1], [11, 1, 7], [7, 1, 5]],
[[9, 5, 8], [8, 5, 7], [10, 1, 3], [10, 3, 11]],
[[5, 7, 0], [5, 0, 9], [7, 11, 0], [1, 0, 10], [11, 10, 0]],
[[11, 10, 0], [11, 0, 3], [10, 5, 0], [8, 0, 7], [5, 7, 0]],
[[11, 10, 5], [7, 11, 5]],
[[10, 6, 5]],
[[0, 8, 3], [5, 10, 6]],
[[9, 0, 1], [5, 10, 6]],
[[1, 8, 3], [1, 9, 8], [5, 10, 6]],
[[1, 6, 5], [2, 6, 1]],
[[1, 6, 5], [1, 2, 6], [3, 0, 8]],
[[9, 6, 5], [9, 0, 6], [0, 2, 6]],
[[5, 9, 8], [5, 8, 2], [5, 2, 6], [3, 2, 8]],
[[2, 3, 11], [10, 6, 5]],
[[11, 0, 8], [11, 2, 0], [10, 6, 5]],
[[0, 1, 9], [2, 3, 11], [5, 10, 6]],
[[5, 10, 6], [1, 9, 2], [9, 11, 2], [9, 8, 11]],
[[6, 3, 11], [6, 5, 3], [5, 1, 3]],
[[0, 8, 11], [0, 11, 5], [0, 5, 1], [5, 11, 6]],
[[3, 11, 6], [0, 3, 6], [0, 6, 5], [0, 5, 9]],
[[6, 5, 9], [6, 9, 11], [11, 9, 8]],
[[5, 10, 6], [4, 7, 8]],
[[4, 3, 0], [4, 7, 3], [6, 5, 10]],
[[1, 9, 0], [5, 10, 6], [0, 4, 7]],
[[10, 6, 5], [1, 9, 7], [1, 7, 3], [7, 9, 4]],
[[6, 1, 2], [6, 5, 1], [4, 7, 8]],
[[1, 2, 5], [5, 2, 6], [3, 0, 4], [3, 4, 7]],
[[8, 4, 7], [9, 0, 5], [0, 6, 5], [0, 2, 6]],
[[7, 3, 9], [7, 9, 4], [3, 2, 9], [5, 9, 6], [2, 6, 9]],
[[3, 11, 2], [7, 8, 4], [10, 6, 5]],
[[5, 10, 6], [4, 7, 2], [4, 2, 0], [2, 7, 11]],
[[0, 1, 9], [4, 7, 8], [2, 3, 11], [5, 10, 6]],
[[9, 2, 1], [9, 11, 2], [9, 4, 11], [7, 11, 4], [5, 10, 6]],
[[8, 4, 7], [3, 11, 5], [3, 5, 1], [5, 11, 6]],
[[5, 1, 11], [5, 11, 6], [1, 0, 11], [7, 11, 4], [0, 4, 11]],
[[0, 5, 9], [0, 6, 5], [0, 3, 6], [11, 6, 3], [8, 4, 7]],
[[6, 5, 9], [6, 9, 11], [4, 7, 9], [7, 11, 9]],
[[10, 4, 9], [6, 4, 10]],
[[4, 10, 6], [4, 9, 10], [0, 8, 3]],
[[10, 0, 1], [10, 6, 0], [6, 4, 0]],
[[8, 3, 1], [8, 1, 6], [8, 6, 4], [6, 1, 10]],
[[1, 4, 9], [1, 2, 4], [2, 6, 4]],
[[3, 0, 8], [1, 2, 9], [2, 4, 9], [2, 6, 4]],
[[0, 2, 4], [4, 2, 6]],
[[8, 3, 2], [8, 2, 4], [4, 2, 6]],
[[10, 4, 9], [10, 6, 4], [11, 2, 3]],
[[0, 8, 2], [2, 8, 11], [4, 9, 10], [4, 10, 6]],
[[3, 11, 2], [0, 1, 6], [0, 6, 4], [6, 1, 10]],
[[6, 4, 1], [6, 1, 10], [4, 8, 1], [2, 1, 11], [8, 11, 1]],
[[9, 6, 4], [9, 3, 6], [9, 1, 3], [11, 6, 3]],
[[8, 11, 1], [8, 1, 0], [11, 6, 1], [9, 1, 4], [6, 4, 1]],
[[3, 11, 6], [3, 6, 0], [0, 6, 4]],
[[6, 4, 8], [11, 6, 8]],
[[7, 10, 6], [7, 8, 10], [8, 9, 10]],
[[0, 7, 3], [0, 10, 7], [0, 9, 10], [6, 7, 10]],
[[10, 6, 7], [1, 10, 7], [1, 7, 8], [1, 8, 0]],
[[10, 6, 7], [10, 7, 1], [1, 7, 3]],
[[1, 2, 6], [1, 6, 8], [1, 8, 9], [8, 6, 7]],
[[2, 6, 9], [2, 9, 1], [6, 7, 9], [0, 9, 3], [7, 3, 9]],
[[7, 8, 0], [7, 0, 6], [6, 0, 2]],
[[7, 3, 2], [6, 7, 2]],
[[2, 3, 11], [10, 6, 8], [10, 8, 9], [8, 6, 7]],
[[2, 0, 7], [2, 7, 11], [0, 9, 7], [6, 7, 10], [9, 10, 7]],
[[1, 8, 0], [1, 7, 8], [1, 10, 7], [6, 7, 10], [2, 3, 11]],
[[11, 2, 1], [11, 1, 7], [10, 6, 1], [6, 7, 1]],
[[8, 9, 6], [8, 6, 7], [9, 1, 6], [11, 6, 3], [1, 3, 6]],
[[0, 9, 1], [11, 6, 7]],
[[7, 8, 0], [7, 0, 6], [3, 11, 0], [11, 6, 0]],
[[7, 11, 6]],
[[7, 6, 11]],
[[3, 0, 8], [11, 7, 6]],
[[0, 1, 9], [11, 7, 6]],
[[8, 1, 9], [8, 3, 1], [11, 7, 6]],
[[10, 1, 2], [6, 11, 7]],
[[1, 2, 10], [3, 0, 8], [6, 11, 7]],
[[2, 9, 0], [2, 10, 9], [6, 11, 7]],
[[6, 11, 7], [2, 10, 3], [10, 8, 3], [10, 9, 8]],
[[7, 2, 3], [6, 2, 7]],
[[7, 0, 8], [7, 6, 0], [6, 2, 0]],
[[2, 7, 6], [2, 3, 7], [0, 1, 9]],
[[1, 6, 2], [1, 8, 6], [1, 9, 8], [8, 7, 6]],
[[10, 7, 6], [10, 1, 7], [1, 3, 7]],
[[10, 7, 6], [1, 7, 10], [1, 8, 7], [1, 0, 8]],
[[0, 3, 7], [0, 7, 10], [0, 10, 9], [6, 10, 7]],
[[7, 6, 10], [7, 10, 8], [8, 10, 9]],
[[6, 8, 4], [11, 8, 6]],
[[3, 6, 11], [3, 0, 6], [0, 4, 6]],
[[8, 6, 11], [8, 4, 6], [9, 0, 1]],
[[9, 4, 6], [9, 6, 3], [9, 3, 1], [11, 3, 6]],
[[6, 8, 4], [6, 11, 8], [2, 10, 1]],
[[1, 2, 10], [3, 0, 11], [0, 6, 11], [0, 4, 6]],
[[4, 11, 8], [4, 6, 11], [0, 2, 9], [2, 10, 9]],
[[10, 9, 3], [10, 3, 2], [9, 4, 3], [11, 3, 6], [4, 6, 3]],
[[8, 2, 3], [8, 4, 2], [4, 6, 2]],
[[0, 4, 2], [4, 6, 2]],
[[1, 9, 0], [2, 3, 4], [2, 4, 6], [4, 3, 8]],
[[1, 9, 4], [1, 4, 2], [2, 4, 6]],
[[8, 1, 3], [8, 6, 1], [8, 4, 6], [6, 10, 1]],
[[10, 1, 0], [10, 0, 6], [6, 0, 4]],
[[4, 6, 3], [4, 3, 8], [6, 10, 3], [0, 3, 9], [10, 9, 3]],
[[10, 9, 4], [6, 10, 4]],
[[4, 9, 5], [7, 6, 11]],
[[0, 8, 3], [4, 9, 5], [11, 7, 6]],
[[5, 0, 1], [5, 4, 0], [7, 6, 11]],
[[11, 7, 6], [8, 3, 4], [3, 5, 4], [3, 1, 5]],
[[9, 5, 4], [10, 1, 2], [7, 6, 11]],
[[6, 11, 7], [1, 2, 10], [0, 8, 3], [4, 9, 5]],
[[7, 6, 11], [5, 4, 10], [4, 2, 10], [4, 0, 2]],
[[3, 4, 8], [3, 5, 4], [3, 2, 5], [10, 5, 2], [11, 7, 6]],
[[7, 2, 3], [7, 6, 2], [5, 4, 9]],
[[9, 5, 4], [0, 8, 6], [0, 6, 2], [6, 8, 7]],
[[3, 6, 2], [3, 7, 6], [1, 5, 0], [5, 4, 0]],
[[6, 2, 8], [6, 8, 7], [2, 1, 8], [4, 8, 5], [1, 5, 8]],
[[9, 5, 4], [10, 1, 6], [1, 7, 6], [1, 3, 7]],
[[1, 6, 10], [1, 7, 6], [1, 0, 7], [8, 7, 0], [9, 5, 4]],
[[4, 0, 10], [4, 10, 5], [0, 3, 10], [6, 10, 7], [3, 7, 10]],
[[7, 6, 10], [7, 10, 8], [5, 4, 10], [4, 8, 10]],
[[6, 9, 5], [6, 11, 9], [11, 8, 9]],
[[3, 6, 11], [0, 6, 3], [0, 5, 6], [0, 9, 5]],
[[0, 11, 8], [0, 5, 11], [0, 1, 5], [5, 6, 11]],
[[6, 11, 3], [6, 3, 5], [5, 3, 1]],
[[1, 2, 10], [9, 5, 11], [9, 11, 8], [11, 5, 6]],
[[0, 11, 3], [0, 6, 11], [0, 9, 6], [5, 6, 9], [1, 2, 10]],
[[11, 8, 5], [11, 5, 6], [8, 0, 5], [10, 5, 2], [0, 2, 5]],
[[6, 11, 3], [6, 3, 5], [2, 10, 3], [10, 5, 3]],
[[5, 8, 9], [5, 2, 8], [5, 6, 2], [3, 8, 2]],
[[9, 5, 6], [9, 6, 0], [0, 6, 2]],
[[1, 5, 8], [1, 8, 0], [5, 6, 8], [3, 8, 2], [6, 2, 8]],
[[1, 5, 6], [2, 1, 6]],
[[1, 3, 6], [1, 6, 10], [3, 8, 6], [5, 6, 9], [8, 9, 6]],
[[10, 1, 0], [10, 0, 6], [9, 5, 0], [5, 6, 0]],
[[0, 3, 8], [5, 6, 10]],
[[10, 5, 6]],
[[11, 5, 10], [7, 5, 11]],
[[11, 5, 10], [11, 7, 5], [8, 3, 0]],
[[5, 11, 7], [5, 10, 11], [1, 9, 0]],
[[10, 7, 5], [10, 11, 7], [9, 8, 1], [8, 3, 1]],
[[11, 1, 2], [11, 7, 1], [7, 5, 1]],
[[0, 8, 3], [1, 2, 7], [1, 7, 5], [7, 2, 11]],
[[9, 7, 5], [9, 2, 7], [9, 0, 2], [2, 11, 7]],
[[7, 5, 2], [7, 2, 11], [5, 9, 2], [3, 2, 8], [9, 8, 2]],
[[2, 5, 10], [2, 3, 5], [3, 7, 5]],
[[8, 2, 0], [8, 5, 2], [8, 7, 5], [10, 2, 5]],
[[9, 0, 1], [5, 10, 3], [5, 3, 7], [3, 10, 2]],
[[9, 8, 2], [9, 2, 1], [8, 7, 2], [10, 2, 5], [7, 5, 2]],
[[1, 3, 5], [3, 7, 5]],
[[0, 8, 7], [0, 7, 1], [1, 7, 5]],
[[9, 0, 3], [9, 3, 5], [5, 3, 7]],
[[9, 8, 7], [5, 9, 7]],
[[5, 8, 4], [5, 10, 8], [10, 11, 8]],
[[5, 0, 4], [5, 11, 0], [5, 10, 11], [11, 3, 0]],
[[0, 1, 9], [8, 4, 10], [8, 10, 11], [10, 4, 5]],
[[10, 11, 4], [10, 4, 5], [11, 3, 4], [9, 4, 1], [3, 1, 4]],
[[2, 5, 1], [2, 8, 5], [2, 11, 8], [4, 5, 8]],
[[0, 4, 11], [0, 11, 3], [4, 5, 11], [2, 11, 1], [5, 1, 11]],
[[0, 2, 5], [0, 5, 9], [2, 11, 5], [4, 5, 8], [11, 8, 5]],
[[9, 4, 5], [2, 11, 3]],
[[2, 5, 10], [3, 5, 2], [3, 4, 5], [3, 8, 4]],
[[5, 10, 2], [5, 2, 4], [4, 2, 0]],
[[3, 10, 2], [3, 5, 10], [3, 8, 5], [4, 5, 8], [0, 1, 9]],
[[5, 10, 2], [5, 2, 4], [1, 9, 2], [9, 4, 2]],
[[8, 4, 5], [8, 5, 3], [3, 5, 1]],
[[0, 4, 5], [1, 0, 5]],
[[8, 4, 5], [8, 5, 3], [9, 0, 5], [0, 3, 5]],
[[9, 4, 5]],
[[4, 11, 7], [4, 9, 11], [9, 10, 11]],
[[0, 8, 3], [4, 9, 7], [9, 11, 7], [9, 10, 11]],
[[1, 10, 11], [1, 11, 4], [1, 4, 0], [7, 4, 11]],
[[3, 1, 4], [3, 4, 8], [1, 10, 4], [7, 4, 11], [10, 11, 4]],
[[4, 11, 7], [9, 11, 4], [9, 2, 11], [9, 1, 2]],
[[9, 7, 4], [9, 11, 7], [9, 1, 11], [2, 11, 1], [0, 8, 3]],
[[11, 7, 4], [11, 4, 2], [2, 4, 0]],
[[11, 7, 4], [11, 4, 2], [8, 3, 4], [3, 2, 4]],
[[2, 9, 10], [2, 7, 9], [2, 3, 7], [7, 4, 9]],
[[9, 10, 7], [9, 7, 4], [10, 2, 7], [8, 7, 0], [2, 0, 7]],
[[3, 7, 10], [3, 10, 2], [7, 4, 10], [1, 10, 0], [4, 0, 10]],
[[1, 10, 2], [8, 7, 4]],
[[4, 9, 1], [4, 1, 7], [7, 1, 3]],
[[4, 9, 1], [4, 1, 7], [0, 8, 1], [8, 7, 1]],
[[4, 0, 3], [7, 4, 3]],
[[4, 8, 7]],
[[9, 10, 8], [10, 11, 8]],
[[3, 0, 9], [3, 9, 11], [11, 9, 10]],
[[0, 1, 10], [0, 10, 8], [8, 10, 11]],
[[3, 1, 10], [11, 3, 10]],
[[1, 2, 11], [1, 11, 9], [9, 11, 8]],
[[3, 0, 9], [3, 9, 11], [1, 2, 9], [2, 11, 9]],
[[0, 2, 11], [8, 0, 11]],
[[3, 2, 11]],
[[2, 3, 8], [2, 8, 10], [10, 8, 9]],
[[9, 10, 2], [0, 9, 2]],
[[2, 3, 8], [2, 8, 10], [0, 1, 8], [1, 10, 8]],
[[1, 10, 2]],
[[1, 3, 8], [9, 1, 8]],
[[0, 9, 1]],
[[0, 3, 8]],
[]]

def optimizevertex(vert,opt,f):
	a=0
	b=1
	x=0.5
	if vert[0]==0.5: #x
		optfunc= lambda u: f(u,vert[1],vert[2])	
		for i in range(opt):
			if optfunc(a) ^ optfunc(x):
				b=x
			else:
				a=x
			x=(a+b)/2
		return (x,vert[1],vert[2])
	if vert[1]==0.5: #y
		optfunc= lambda x: f(vert[0],x,vert[2])	
		for i in range(opt):
			if optfunc(a) ^ optfunc(x):
				b=x
			else:
				a=x
			x=(a+b)/2
		#print vert,x
		return (vert[0],x,vert[2])
	if vert[2]==0.5: #z
		optfunc= lambda x: f(vert[0],vert[1],x)	
		for i in range(opt):
			if optfunc(a) ^ optfunc(x):
				b=x
			else:
				a=x
			x=(a+b)/2
		return (vert[0],vert[1],x)

def gencellfaces(values,resolution,x,y,z,func,opt=3): #Marching cubes core 
	index=0     #get values in cell vertexes, cell size and cell coordinates
	if values[0]: index |= 1
	if values[1]: index |= 2
	if values[2]: index |= 4
	if values[3]: index |= 8
	if values[4]: index |= 16
	if values[5]: index |= 32
	if values[6]: index |= 64
	if values[7]: index |= 128
	faces=faces_by_case[index]
	res=[]
	for face in faces:
		f=[]
		for v in face:
			vert=vertex_by_edge[v]
			if opt>0:
				vert=optimizevertex(vert,opt+1,lambda a1,a2,a3: func(a1*resolution+x,a2*resolution+y,a3*resolution+z) )
			f.append( (vert[0]*resolution+x,vert[1]*resolution+y,vert[2]*resolution+z) ) 
		res.append(f)
	return res


class MyMesh():
	def __init__(self):
		self.vertexcount=0
		self.vertexnumbers={}
		self.vertexes=[]
		self.faces=[]
	def addvertex(self,a): # Very narrow place here. But how optimize it?
		if a in self.vertexnumbers:
			return self.vertexnumbers[a]
		else:
			self.vertexnumbers[a]=self.vertexcount
			self.vertexes.append(a)
			self.vertexcount+=1
			return self.vertexcount-1
	def addface(self,a,b,c):
		self.faces.append( (self.addvertex(a),self.addvertex(b),self.addvertex(c)) )
	def addfaces(self,lst):
		for face in lst:
			self.addface(face[0],face[1],face[2])

	def getNMesh(self):
		obj=NMesh.GetRaw()
		for v in self.vertexes:
			obj.verts.append(NMesh.Vert(v[0],v[1],v[2]))
		for i in self.faces:
			f=NMesh.Face()
			f.v.append(obj.verts[i[0]])
			f.v.append(obj.verts[i[1]])
			f.v.append(obj.verts[i[2]])
			obj.faces.append(f)
		return obj	

def countvoxels():
	width=int((maxx-minx)/resolution)+1
	height=int((maxy-miny)/resolution)+1
	depth=int((maxz-minz)/resolution)+1
	return width*height*depth

def createmesh(f,minx,miny,minz,maxx,maxy,maxz,resolution,name):	
	mesh=MyMesh()

	width=int((maxx-minx)/resolution)+1
	height=int((maxy-miny)/resolution)+1
	depth=int((maxz-minz)/resolution)+1

	xx = lambda x: minx+x*resolution
	yy = lambda y: miny+y*resolution
	zz = lambda z: minz+z*resolution

	for z in range(depth):
		global progress
		progress=float(z)/depth*100
		Blender.Draw.Draw()		
		for y in range(height):
			for x in range(width):
				values=[
				f(xx(x),yy(y),zz(z)),	
				f(xx(x+1),yy(y),zz(z)),
				f(xx(x+1),yy(y+1),zz(z)),
				f(xx(x),yy(y+1),zz(z)),
				f(xx(x),yy(y),zz(z+1)),	
				f(xx(x+1),yy(y),zz(z+1)),
				f(xx(x+1),yy(y+1),zz(z+1)),
				f(xx(x),yy(y+1),zz(z+1)),
				]
				faces=gencellfaces(values,resolution,xx(x),yy(y),zz(z),f)
				mesh.addfaces(faces)
	NMesh.PutRaw(mesh.getNMesh(),name,1)

functiontext="somestaff(x,y,z)"
surfacename="voxel1"
statusmessage="All is ok. Hopefully it will."
progress=0

minx=-1.3
miny=-1.33
minz=-1.3

maxx=1.3
maxy=1.3
maxz=1.3

resolution=0.5




def changestring(event,val):
	if event==3:
		global functiontext
		functiontext=val	
	if event==4:
		global surfacename
		surfacename=val
	if event==5:
		global minx
		minx=float(val)
	if event==6:
		global miny
		miny=float(val)
	if event==7:
		global maxx
		maxx=float(val)
	if event==8:
		global maxy
		maxy=float(val)
	if event==9:
		global resolution
		resolution=float(val)
	if event==10:
		global minz
		minz=float(val)
	if event==11:
		global maxz
		maxz=float(val)

def draw():
	Blender.BGL.glClear(Blender.BGL.GL_COLOR_BUFFER_BIT)
	Blender.Draw.Toggle("Create given surface",1,10,10,150,20,0,)
	Blender.Draw.String("f(x,y,z)=",3,10,50,400,20,functiontext,200,"Type your function here",changestring)
	Blender.Draw.String("Object name: ",4,10,30,150,20,surfacename,100,"What name will be given to created object.",changestring)
	Blender.Draw.String("min_x: ",5,160,30,125,20,str(minx),10,"Minimal x value",changestring)
	Blender.Draw.String("min_y: ",6,285,30,125,20,str(miny),10,"Minimal y value",changestring)
	Blender.Draw.String("min_z: ",10,410,30,125,20,str(miny),10,"Minimal y value",changestring)
	Blender.Draw.String("max_x: ",7,160,10,125,20,str(maxx),10,"Maximal x value",changestring)
	Blender.Draw.String("max_y: ",8,285,10,125,20,str(maxy),10,"Maximal y value",changestring)
	Blender.Draw.String("max_z: ",11,410,10,125,20,str(maxy),10,"Maximal y value",changestring)
	Blender.Draw.String("d: ",9,410,50,125,20,str(resolution),10,"Size of one grid cell",changestring) 

	Blender.BGL.glRasterPos2i(10,80)
	Blender.Draw.Text(statusmessage + " voxels: %i" % countvoxels()+ " progress: %i " % int(progress))

def event(evt,val):  
	if evt == Blender.Draw.ESCKEY:
		Blender.Draw.Exit()   
		return                
 
def button(evt):    
	if evt == 1: 
		createmesh(f,minx,miny,minz,maxx,maxy,maxz,resolution,functiontext)
		Blender.Window.Redraw()
 
Blender.Draw.Register(draw,event,button)
